// Function.prototype.myApply = function (context = window, ...args) {
//   let key = Symbol("key")
//   context[key] = this
//   let result = context[key](args)
//   delete context[key]
//   return result
// }


// // 测试用例
// let a = "123123123"
// let obj = {
//   a: "12",
//   o: {
//   }
// }

// function demo(args) {
//   console.log(this.a)
//   console.log(...args);
// }

// demo.myApply(obj, [123, 123, 123, 123])


Function.prototype.myApply = function (context = window, ...args) {
  // this-->func  context--> obj  args--> 传递过来的参数

  // 在context上加一个唯一值不影响context上的属性
  let key = Symbol('key')
  context[key] = this; // context为调用的上下文,this此处为函数，将这个函数作为context的方法
  // let args = [...arguments].slice(1)   //第一个参数为obj所以删除,伪数组转为数组
  console.log(args);

  let result = context[key](args); // 这里和call传参不一样
  delete context[key]; // 不删除会导致context属性越来越多
  return result;
}

let obj = {
  name: 11,
  age: 22
}

Function.prototype.myBind = function (context, ...arg1) {

  var self = this
  return function (...arg2) {
    self.myApply(context, [...arg1, ...arg2])
  }
}




console.log(demo.myBind(obj, 1, 2, 3)(1, 2));











// 测试用例
// let a = "123123123"
// let obj = {
//   a: "12",
//   o: {
//   }
// }

// function demo(args) {
//   console.log(this.a)
//   console.log(...args);
// }
// demo.Mybind(obj, 1, 2)()




